/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package AppletInterface;

import SnmpAll.SnmpData;
import SnmpAll.SnmpFetcher;
import SnmpClients.SnmpClientV2c;
import SnmpClients.SnmpClienteV3;
import com.agentpp.common.smi.editor.Token.Text;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ButtonGroup;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTable;

/**
 * Applet -> Interface gráfico da aplicação. Encarregue de chamar todas as outras classes e instanciá-las.
 * 
 */
public class AppletStart extends JApplet implements ActionListener {

    JTable tab;
    ModeloTable mod;
    JScrollPane scroll;
    SnmpFetcher sft;
    SnmpClienteV3 scv3;
    SnmpClientV2c scv2c;
    AppletStartListener asl;
    ButtonGroup groupbutton;
    JRadioButton radiobuttonv3;
    JRadioButton radiobuttonv2c;
    JPanel radioPanel;
    //Ligação ao servidor
    TextField server;
    TextField user;
    TextField md5pass;
    TextField despass;
    TextField pollingTime;
    JPanel textPanel;
    JPanel mainPanel;
    JButton connectButton;

    @Override
    public void init() {
        try {
            jbInit();
        } catch (Exception e) {
        }
    }

    private void jbInit() throws Exception {

        //Inicializar Listener
        asl = new AppletStartListener() {

            //função executada de cada vez que um evento é lançado
            @Override
            public void actualiza(AppletStartEvent as) {
                try {
                    //refrescar todo o interface
                    as.as.updateData();
                } catch (InterruptedException ex) {
                    Logger.getLogger(AppletStart.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        };

        //criar o layout do content panel
        this.getContentPane().setLayout(new BorderLayout());
        //desenhar os "radio buttons" de escolha da versão do snmp
        drawRadioButtonsHeader();
        
        //inicialização dos clientes snmp e do snmp fetcher
        scv2c = null;
        scv3 = null;
        sft = null;

        //refrescar o interface
        updateInterface();
    }

    /**
     * Desenhar os Botões para escolha do protocolo snmp a usar (versão 2c ou 3)
     */
    public void drawRadioButtonsHeader() {

        //Inicializar radiobutton's e textfiled's
        radiobuttonv2c = new JRadioButton("SNMP V2c");
        radiobuttonv2c.setMnemonic(KeyEvent.VK_B);
        //radiobuttonv2c.setSelected(true);

        radiobuttonv3 = new JRadioButton("SNMP V3");
        radiobuttonv3.setMnemonic(KeyEvent.VK_C);

        groupbutton = new ButtonGroup();
        groupbutton.add(radiobuttonv2c);
        groupbutton.add(radiobuttonv3);

        radiobuttonv2c.addActionListener(this);
        radiobuttonv2c.setActionCommand("1");
        radiobuttonv3.addActionListener(this);
        radiobuttonv3.setActionCommand("2");

        //Adicionar os botões ao Panel
        radioPanel = new JPanel();
        radioPanel.add(radiobuttonv2c);
        radioPanel.add(radiobuttonv3);

        //Adicionar o Panel ao content panel
        this.getContentPane().add(radioPanel, BorderLayout.NORTH);
        //mainPanel.add(radioPanel,BorderLayout.NORTH);
    }

    /**
     * Desenha as caixas de texto quando é escolhida a segunda versão do protocolo snmp
     * 
     * @param server IP do servidor e porta
     * @param pollintTime Tempo de polling
     */
    public void drawTextFieldV2(String server, String pollintTime) {

        //desenhar as caixas de texto
        this.server = new TextField(server);
        this.pollingTime = new TextField(pollintTime);
        textPanel = new JPanel();

        connectButton = new JButton("Connect");
        
        //adicionar listener quando o botao é carregado
        connectButton.addActionListener(this);
        connectButton.setActionCommand("3");

        //Adicionar as caixas de texto e o botão ao textPanel
        textPanel.add(this.server);
        textPanel.add(this.pollingTime);
        textPanel.add(connectButton);

        //mainPanel.add(textPanel,BorderLayout.CENTER);
        //adicionar o textPanel ao ContentPane
        this.getContentPane().add(textPanel, BorderLayout.CENTER);
    }

    /**
     * Desenhar as caixas de texto quando é escolhida a versão 3 do snmp
     * 
     * @param server IP e porta do servidor
     * @param user nome do utilizador
     * @param md5pass Palavra chave MD5
     * @param despass Palavra chave DES
     * @param pollintTime Tempo de polling
     */
    public void drawTextFieldV3(String server, String user, String md5pass, String despass, String pollintTime) {

        //Inicialização dos textFields
        this.server = new TextField(server);
        this.user = new TextField(user);
        this.md5pass = new TextField(md5pass);
        this.despass = new TextField(despass);
        this.pollingTime = new TextField(pollintTime);
        
        connectButton = new JButton("Connect");
        //adição do listener à acção de carregar no botão
        connectButton.addActionListener(this);
        connectButton.setActionCommand("4");

        textPanel = new JPanel();

        //adicionar caixas de texto e o botão ao panel
        textPanel.add(this.server);
        textPanel.add(this.user);
        textPanel.add(this.md5pass);
        textPanel.add(this.despass);
        textPanel.add(this.pollingTime);
        textPanel.add(connectButton);
        


        //mainPanel.add(textPanel,BorderLayout.CENTER);
        
        //adição do textPanel ao COntentPane
        this.getContentPane().add(textPanel, BorderLayout.CENTER);
    }

    /**
     * Update da interface / Repintar a interface
     */
    public void updateInterface() {

        this.getContentPane().repaint();
        this.validate();
    }

    /**
     * Redesenha apenas da tabela com a informação
     * 
     * @throws InterruptedException
     */
    public void updateData() throws InterruptedException {


        this.getContentPane().removeAll();
        this.getContentPane().setLayout(new BorderLayout());
        drawRadioButtonsHeader();

        if (scv2c != null) {
            radiobuttonv2c.setSelected(true);
            drawTextFieldV2(server.getText(),pollingTime.getText());
        } else if (scv3 != null) {
            radiobuttonv3.setSelected(true);
            drawTextFieldV3(server.getText(), user.getText(), md5pass.getText(), despass.getText(), pollingTime.getText());
        }

        this.mod = new ModeloTable(sft);
        this.tab = new JTable(mod);
        this.tab.repaint();

        this.tab.setBackground(Color.CYAN);
        this.tab.setCellSelectionEnabled(true);
        this.tab.setGridColor(Color.lightGray);
        this.tab.setRowHeight(25);

        //Adicionar o tab ao scroll e adicionar o scroll ao ContentPane
        this.scroll = new JScrollPane(this.tab, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        this.scroll.repaint();

        this.getContentPane().add(this.scroll);

        updateInterface();
    }

    /**
     * Processa os eventos lançados, redesenhando partes do interface de acordo com cada um deles
     */
    @Override
    public void actionPerformed(ActionEvent ae) {
        int n;
        try {
            n = Integer.parseInt(ae.getActionCommand());
        } catch (NumberFormatException e) {
            n = 1;
        }

        if (n == 1) {
            if (sft != null) {
                sft.stop();
            }

            this.getContentPane().removeAll();
            this.getContentPane().setLayout(new BorderLayout());
            drawRadioButtonsHeader();

            radiobuttonv2c.setSelected(true);
            drawTextFieldV2("udp:serverIP/port", "Polling time (seconds)");
            updateInterface();

        } else if (n == 2) {

            if (sft != null) {
                sft.stop();
            }
            this.getContentPane().removeAll();
            this.getContentPane().setLayout(new BorderLayout());
            drawRadioButtonsHeader();

            radiobuttonv3.setSelected(true);
            //drawTextFieldV3("udp:serverIP/port", "Username", "MD5 Password", "DES Password", "Polling time (seconds)");
            drawTextFieldV3("udp:localhost/7001", "gk", "pass1234", "pass9999","Polling time (seconds)");
            updateInterface();
            
        } else if (n == 3) {

            this.getContentPane().removeAll();
            this.getContentPane().setLayout(new BorderLayout());
            drawRadioButtonsHeader();
            radiobuttonv2c.setSelected(true);
            drawTextFieldV2(server.getText(),pollingTime.getText());

            try {
                scv2c = new SnmpClientV2c(server.getText());
            } catch (IOException ex) {
                Logger.getLogger(AppletStart.class.getName()).log(Level.SEVERE, null, ex);
            }

            sft = new SnmpFetcher(null, scv2c, new SnmpData(), Float.parseFloat(pollingTime.getText()), asl, this);
            sft.start();

            updateInterface();
        } else if (n == 4) {
            this.getContentPane().removeAll();
            this.getContentPane().setLayout(new BorderLayout());
            drawRadioButtonsHeader();
            radiobuttonv3.setSelected(true);
            drawTextFieldV3(server.getText(), user.getText(), md5pass.getText(), despass.getText(), pollingTime.getText());
            try {
                //Inicializar a ligação 
                scv3 = new SnmpClienteV3(server.getText(), user.getText(), md5pass.getText(), despass.getText());
            } catch (IOException ex) {
                Logger.getLogger(AppletStart.class.getName()).log(Level.SEVERE, null, ex);
            }

            sft = new SnmpFetcher(scv3, null, new SnmpData(), Float.parseFloat(pollingTime.getText()), asl, this);
            sft.start();

            updateInterface();
        }

    }
}